--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNode_Firmware_CE.ino HEAD (a42f8d32) Text, 55.17 KB
T8b949e// Copyright (C) 2024, Mark Qvist
T8b949e// This program is free software: you can redistribute it and/or modify
T8b949e// it under the terms of the GNU General Public License as published by
T8b949e// the Free Software Foundation, either version 3 of the License, or
T8b949e// (at your option) any later version.
T8b949e// This program is distributed in the hope that it will be useful,
T8b949e// but WITHOUT ANY WARRANTY; without even the implied warranty of
T8b949e// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
T8b949e// GNU General Public License for more details.
T8b949e// You should have received a copy of the GNU General Public License
T8b949e// along with this program. If not, see <https://www.gnu.org/licenses/>.
Tff7b72#Tff7b72include T8b949e<Arduino.h>
Tff7b72#Tff7b72include T8b949e<SPI.h>
Tff7b72#Tff7b72include T8b949e"Utilities.h"
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_OPENCOM_XL
Tff7b72#Tff7b72define INTERFACE_SPI
T8b949e// Required because on RAK4631, non-default SPI pins must be initialised when class is declared.
Te6edf3SPIClass Te6edf3interface_spiTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4{
T8b949e// SX1262
Te6edf3SPIClassTb4b4b4(
Te6edf3NRF_SPIM2Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Tb4b4b4)
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TECHO
Tff7b72#Tff7b72define INTERFACE_SPI
Te6edf3SPIClass Te6edf3interface_spiTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4{
T8b949e// SX1262
Te6edf3SPIClassTb4b4b4(
Te6edf3NRF_SPIM3Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Tb4b4b4)
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC_T114
Tff7b72#Tff7b72define INTERFACE_SPI
Te6edf3SPIClass Te6edf3interface_spiTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4{
T8b949e// SX1262
Te6edf3SPIClassTb4b4b4(
Te6edf3NRF_SPIM1Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Tb4b4b4)
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef INTERFACE_SPI
T8b949e// INTERFACE_SPI is only required on NRF52 platforms, as the SPI pins are set in the class constructor and not by a setter method.
T8b949e// Even if custom SPI interfaces are not needed, the array must exist to prevent compilation errors.
Tff7b72#Tff7b72define INTERFACE_SPI
Te6edf3SPIClass Te6edf3interface_spiTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3FIFOBuffer Te6edf3serialFIFOTb4b4b4;
Tff7b72uint8_t Te6edf3serialBufferTb4b4b4[Te6edf3CONFIG_UART_BUFFER_SIZETff7b72+T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72uint16_t Te6edf3packet_starts_bufTb4b4b4[Tb4b4b4(Te6edf3CONFIG_QUEUE_MAX_LENGTHTb4b4b4)Tff7b72+T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72uint16_t Te6edf3packet_lengths_bufTb4b4b4[Tb4b4b4(Te6edf3CONFIG_QUEUE_MAX_LENGTHTb4b4b4)Tff7b72+T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3FIFOBuffer16 Te6edf3packet_startsTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4]Tb4b4b4;
Te6edf3FIFOBuffer16 Te6edf3packet_lengthsTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4]Tb4b4b4;
Tff7b72volatile Tff7b72uint8_t Te6edf3queue_heightTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tff7b72volatile Tff7b72uint16_t Te6edf3queued_bytesTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tff7b72volatile Tff7b72uint16_t Te6edf3queue_cursorTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tff7b72volatile Tff7b72uint16_t Te6edf3current_packet_startTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Tff7b72volatile Tff7b72bool Te6edf3serial_buffering Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72extern Tff7b72void Td2a8ffsetup_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// from /src/misc/ModemISR.h
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE == true
Tff7b72bool Te6edf3bt_init_ran Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_CONSOLE
Tff7b72#Tff7b72include T8b949e"Console.h"
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define MODEM_QUEUE_SIZE 4*INTERFACE_COUNT
Tff7b72typedef Tff7b72struct Tb4b4b4{
Tffa657size_t Te6edf3lenTb4b4b4;
Tff7b72int Te6edf3rssiTb4b4b4;
Tff7b72int Te6edf3snr_rawTb4b4b4;
Tff7b72uint8_t Te6edf3interfaceTb4b4b4;
Tff7b72uint8_t Te6edf3dataTb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4} Te6edf3modem_packet_tTb4b4b4;
Tff7b72static Te6edf3xQueueHandle Te6edf3modem_packet_queue Tff7b72= Tffa657NULLTb4b4b4;
Tff7b72char Te6edf3sbufTb4b4b4[T79c0ff128Tb4b4b4]Tb4b4b4;
Tff7b72uint8_t Tff7b72*Te6edf3packet_queueTb4b4b4[Te6edf3INTERFACE_COUNTTb4b4b4]Tb4b4b4;
Tff7b72void Tffa657setupTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Te6edf3boot_seqTb4b4b4(Tb4b4b4)Tb4b4b4;
Td2a8ffEEPROMTb4b4b4.Td2a8ffbeginTb4b4b4(Te6edf3EEPROM_SIZETb4b4b4)Tb4b4b4;
Td2a8ffSerialTb4b4b4.Te6edf3setRxBufferSizeTb4b4b4(Te6edf3CONFIG_UART_BUFFER_SIZETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_TDECK
Td2a8ffpinModeTb4b4b4(Te6edf3pin_poweronTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3pin_poweronTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3SD_CSTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3DISPLAY_CSTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3SD_CSTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3DISPLAY_CSTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3DISPLAY_BL_PINTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_TECHO
Td2a8ffdelayTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3pin_btn_usr1Tb4b4b4, Tff7b72INPUT_PULLUPTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3pin_btn_touchTb4b4b4, Tff7b72INPUT_PULLUPTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_LED_REDTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_LED_GREENTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_LED_BLUETb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC_T114
Td2a8ffdelayTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3eeprom_beginTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffEEPROM initialisation failed.Tffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72endif
T8b949e// Seed the PRNG for CSMA R-value selection
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
T8b949e// On ESP32, get the seed value from the
T8b949e// hardware RNG
Tff7b72unsigned Tff7b72long Te6edf3seed_val Tff7b72= Tb4b4b4(Tff7b72unsigned Tff7b72longTb4b4b4)Te6edf3esp_randomTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
T8b949e// On nRF, get the seed value from the
T8b949e// hardware RNG
Tff7b72unsigned Tff7b72long Te6edf3seed_val Tff7b72= Te6edf3get_rng_seedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e// Otherwise, get a pseudo-random seed
T8b949e// value from an unconnected analog pin
T8b949e//
T8b949e// CAUTION! If you are implementing the
T8b949e// firmware on a platform that does not
T8b949e// have a hardware RNG, you MUST take
T8b949e// care to get a seed value with enough
T8b949e// entropy at each device reset!
Tff7b72unsigned Tff7b72long Te6edf3seed_val Tff7b72= Td2a8ffanalogReadTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Td2a8ffrandomSeedTb4b4b4(Te6edf3seed_valTb4b4b4)Tb4b4b4;
T8b949e// Initialise serial communication
Te6edf3memsetTb4b4b4(Te6edf3serialBufferTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3serialBufferTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3fifo_initTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4, Te6edf3serialBufferTb4b4b4, Te6edf3CONFIG_UART_BUFFER_SIZETb4b4b4)Tb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffbeginTb4b4b4(Te6edf3serial_baudrateTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_NP
Te6edf3led_initTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52 && HAS_NP == true
Te6edf3boot_seqTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 && BOARD_MODEL != BOARD_OPENCOM_XL
T8b949e// Some boards need to wait until the hardware UART is set up before booting
T8b949e// the full firmware. In the case of the RAK4631/TECHO, the line below will wait
T8b949e// until a serial connection is actually established with a master. Thus, it
T8b949e// is disabled on this platform.
Tff7b72while Tb4b4b4(Tff7b72!Td2a8ffSerialTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// Configure input and output pins
Tff7b72#Tff7b72if HAS_INPUT
Te6edf3input_initTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_NP == false
Td2a8ffpinModeTb4b4b4(Te6edf3pin_led_rxTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffpinModeTb4b4b4(Te6edf3pin_led_txTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff9Tb4b4b4] Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Td2a8ffpinModeTb4b4b4(Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff9Tb4b4b4]Tb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff9Tb4b4b4]Tb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Initialise buffers
Te6edf3memsetTb4b4b4(Te6edf3pbufTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3pbufTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3cmdbufTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3cmdbufTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3packet_starts_bufTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3packet_starts_bufTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3packet_lengths_bufTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3packet_starts_bufTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3seqTb4b4b4, T79c0ff0xFFTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3seqTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3read_lenTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3read_lenTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3setup_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3modem_packet_queue Tff7b72= Te6edf3xQueueCreateTb4b4b4(Te6edf3MODEM_QUEUE_SIZETb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3modem_packet_tTff7b72*Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3fifo16_initTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3packet_starts_bufTb4b4b4, Te6edf3CONFIG_QUEUE_MAX_LENGTHTb4b4b4)Tb4b4b4;
Te6edf3fifo16_initTb4b4b4(Tff7b72&Te6edf3packet_lengthsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3packet_lengths_bufTb4b4b4, Te6edf3CONFIG_QUEUE_MAX_LENGTHTb4b4b4)Tb4b4b4;
Te6edf3packet_queueTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Tb4b4b4(Tff7b72uint8_tTff7b72*Tb4b4b4)Te6edf3mallocTb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3iTb4b4b4)Tff7b72+T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3memsetTb4b4b4(Te6edf3packet_rdy_interfaces_bufTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3packet_rdy_interfaces_bufTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3fifo_initTb4b4b4(Tff7b72&Te6edf3packet_rdy_interfacesTb4b4b4, Te6edf3packet_rdy_interfaces_bufTb4b4b4, Te6edf3MAX_INTERFACESTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_GPS
T8b949e// init GPS
Te6edf3gps_sTb4b4b4.Td2a8ffbeginTb4b4b4(Te6edf3GPS_BAUD_RATETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// add call to init_channel_stats here? \todo
T8b949e// Create and configure interface objects
Tff7b72for Tb4b4b4(Tff7b72uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72switch Tb4b4b4(Te6edf3interfacesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72case Tff7b72SX1262Tb4b4b4:
Tb4b4b4{
Te6edf3sx126xTff7b72* Te6edf3objTb4b4b4;
T8b949e// if default spi enabled
Tff7b72if Tb4b4b4(Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx126xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Td2a8ffSPITb4b4b4, Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff8Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx126xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Te6edf3interface_spiTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff8Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Te6edf3interface_obj_sortedTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72SX1276Tb4b4b4:
Tff7b72case Tff7b72SX1278Tb4b4b4:
Tb4b4b4{
Te6edf3sx127xTff7b72* Te6edf3objTb4b4b4;
T8b949e// if default spi enabled
Tff7b72if Tb4b4b4(Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx127xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Td2a8ffSPITb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx127xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Te6edf3interface_spiTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Te6edf3interface_obj_sortedTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72SX1280Tb4b4b4:
Tb4b4b4{
Te6edf3sx128xTff7b72* Te6edf3objTb4b4b4;
T8b949e// if default spi enabled
Tff7b72if Tb4b4b4(Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx128xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Td2a8ffSPITb4b4b4, Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff8Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3obj Tff7b72= Tff7b72new Te6edf3sx128xTb4b4b4(Te6edf3iTb4b4b4, Tff7b72&Te6edf3interface_spiTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3interface_cfgTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4,
Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff8Tb4b4b4]Tb4b4b4, Te6edf3interface_pinsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Te6edf3interface_obj_sortedTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3objTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72defaultTff7b72:
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_T3S3 && BOARD_VARIANT == MODEL_AC
T8b949e// Fix weird radio not found bug on T3S3 SX1280
Td2a8ffdelayTb4b4b4(T79c0ff300Tb4b4b4)Tb4b4b4;
Te6edf3interface_objTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72-Tff7b72>Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// Check installed transceiver chip(s) and probe boot parameters. If any of
T8b949e// the configured modems cannot be initialised, do not boot
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72switch Tb4b4b4(Te6edf3interfacesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72case Tff7b72SX1262Tb4b4b4:
Tff7b72case Tff7b72SX1276Tb4b4b4:
Tff7b72case Tff7b72SX1278Tb4b4b4:
Tff7b72case Tff7b72SX1280Tb4b4b4:
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72defaultTff7b72:
Te6edf3modems_installed Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3preInitTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3modems_installed Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72#Tff7b72if HAS_INPUT
T8b949e// Skip quick-reset console activation
Tff7b72#Tff7b72else
Tff7b72uint32_t Te6edf3lfr Tff7b72= Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3getFrequencyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lfr Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// Normal boot
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3lfr Tff7b72=Tff7b72= Te6edf3M_FRQ_RTb4b4b4) Tb4b4b4{
T8b949e// Quick reboot
Tff7b72#Tff7b72if HAS_CONSOLE
Tff7b72if Tb4b4b4(Te6edf3rtc_get_reset_reasonTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72=Tff7b72= Te6edf3POWERON_RESETTb4b4b4) Tb4b4b4{
Te6edf3console_active Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Unknown boot
Tb4b4b4}
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setFrequencyTb4b4b4(Te6edf3M_FRQ_STb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3modems_installed Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3modems_installedTb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72#Tff7b72if HAS_EEPROM
Tff7b72if Tb4b4b4(Td2a8ffEEPROMTb4b4b4.Td2a8ffreadTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DSETTb4b4b4)Tb4b4b4) Tff7b72!Tff7b72= Te6edf3CONF_OK_BYTETb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tff7b72if Tb4b4b4(Te6edf3eeprom_readTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DSETTb4b4b4)Tb4b4b4) Tff7b72!Tff7b72= Te6edf3CONF_OK_BYTETb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72endif
Te6edf3eeprom_updateTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DSETTb4b4b4)Tb4b4b4, Te6edf3CONF_OK_BYTETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_TECHO
Te6edf3eeprom_updateTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DINTTb4b4b4)Tb4b4b4, T79c0ff0x03Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3eeprom_updateTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DINTTb4b4b4)Tb4b4b4, T79c0ff0xFFTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_OPENCOM_XL && (DISPLAY == EINK_BW || DISPLAY == EINK_3C)
T8b949e// On this board it isn't possible to run the main loop whilst the
T8b949e// display is updating as the SPI pins are shared between the display and
T8b949e// secondary modem. Because running the main loop causes a lockup, we
T8b949e// just run the serial poll loop instead.
Te6edf3display_add_callbackTb4b4b4(Te6edf3process_serialTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif DISPLAY == EINK_BW || DISPLAY == EINK_3C
Te6edf3display_add_callbackTb4b4b4(Te6edf3process_serialTb4b4b4)Tb4b4b4; T8b949e// todo: get this working with work_while_waiting again
Tff7b72#Tff7b72endif
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3disp_ready Tff7b72= Te6edf3display_initTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_PMU == true
Te6edf3pmu_ready Tff7b72= Te6edf3init_pmuTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE == true
Te6edf3bt_initTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_init_ran Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3console_activeTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_CONSOLE
Te6edf3console_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3kiss_indicate_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3kiss_indicate_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3interfacesTb4b4b4[Te6edf3iTb4b4b4] Tff7b72=Tff7b72= Te6edf3SX1280Tb4b4b4) Tb4b4b4{
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setAvdInterferenceTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3getAvdInterferenceTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_EEPROM
Tff7b72uint8_t Te6edf3ia_conf Tff7b72= Td2a8ffEEPROMTb4b4b4.Td2a8ffreadTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DIATb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ia_conf Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{ Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setAvdInterferenceTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72else Tb4b4b4{ Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setAvdInterferenceTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tff7b72uint8_t Te6edf3ia_conf Tff7b72= Te6edf3eeprom_readTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_CONF_DIATb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ia_conf Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{ Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setAvdInterferenceTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72else Tb4b4b4{ Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setAvdInterferenceTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
T8b949e// Validate board health, EEPROM and config
Te6edf3validate_statusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72void Te6edf3lora_receiveTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3implicitTb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3receiveTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3receiveTb4b4b4(Te6edf3implicit_lTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72inline Tff7b72void Te6edf3kiss_write_packetTb4b4b4(Tff7b72int Te6edf3indexTb4b4b4) Tb4b4b4{
T8b949e// Print index of interface the packet came from
Te6edf3serial_writeTb4b4b4(Te6edf3FENDTb4b4b4)Tb4b4b4;
Te6edf3serial_writeTb4b4b4(Te6edf3CMD_SEL_INTTb4b4b4)Tb4b4b4;
Te6edf3serial_writeTb4b4b4(Te6edf3indexTb4b4b4)Tb4b4b4;
Te6edf3serial_writeTb4b4b4(Te6edf3FENDTb4b4b4)Tb4b4b4;
Te6edf3serial_writeTb4b4b4(Te6edf3FENDTb4b4b4)Tb4b4b4;
Te6edf3serial_writeTb4b4b4(Te6edf3CMD_DATATb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72uint16_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Te6edf3portENTER_CRITICALTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72uint8_t Tff7b72byte Tff7b72= Te6edf3pbufTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Te6edf3portEXIT_CRITICALTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72uint8_t Tff7b72byte Tff7b72= Te6edf3pbufTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=Tff7b72= Te6edf3FENDTb4b4b4) Tb4b4b4{ Te6edf3serial_writeTb4b4b4(Te6edf3FESCTb4b4b4)Tb4b4b4; Tff7b72byte Tff7b72= Te6edf3TFENDTb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{ Te6edf3serial_writeTb4b4b4(Te6edf3FESCTb4b4b4)Tb4b4b4; Tff7b72byte Tff7b72= Te6edf3TFESCTb4b4b4; Tb4b4b4}
Te6edf3serial_writeTb4b4b4(Tff7b72byteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3serial_writeTb4b4b4(Te6edf3FENDTb4b4b4)Tb4b4b4;
Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32 && HAS_BLE
Te6edf3bt_flushTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72inline Tff7b72void Te6edf3getPacketDataTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4, Tff7b72uint16_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72uint8_t Te6edf3index Tff7b72= Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if MCU_VARIANT != MCU_NRF52
Tff7b72while Tb4b4b4(Te6edf3lenTff7b72-Tff7b72- Tff7b72&Tff7b72& Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72< Te6edf3MTUTb4b4b4) Tb4b4b4{
Te6edf3pbufTb4b4b4[Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3radioTff7b72-Tff7b72>Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
Te6edf3BaseType_t Te6edf3int_mask Tff7b72= Te6edf3taskENTER_CRITICAL_FROM_ISRTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3lenTff7b72-Tff7b72- Tff7b72&Tff7b72& Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72< Te6edf3MTUTb4b4b4) Tb4b4b4{
Te6edf3pbufTb4b4b4[Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3radioTff7b72-Tff7b72>Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3taskEXIT_CRITICAL_FROM_ISRTb4b4b4(Te6edf3int_maskTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72inline Tff7b72bool Te6edf3queue_packetTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4, Tff7b72uint8_t Te6edf3indexTb4b4b4) Tb4b4b4{
T8b949e// Allocate packet struct, but abort if there
T8b949e// is not enough memory available.
Te6edf3modem_packet_t Tff7b72*Te6edf3modem_packet Tff7b72= Tb4b4b4(Te6edf3modem_packet_tTff7b72*Tb4b4b4)Te6edf3mallocTb4b4b4(Tff7b72sizeofTb4b4b4(Te6edf3modem_packet_tTb4b4b4) Tff7b72+ Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72ifTb4b4b4(Tff7b72!Te6edf3modem_packetTb4b4b4) Tb4b4b4{ Te6edf3memory_low Tff7b72= Tff7b72trueTb4b4b4; Tff7b72return Tff7b72falseTb4b4b4; Tb4b4b4}
T8b949e// Get packet RSSI and SNR
Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3snr_raw Tff7b72= Te6edf3radioTff7b72-Tff7b72>Te6edf3packetSnrRawTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Pass raw SNR to get RSSI as SX127X driver requires it for calculations
Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3rssi Tff7b72= Te6edf3radioTff7b72-Tff7b72>Te6edf3packetRssiTb4b4b4(Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3snr_rawTb4b4b4)Tb4b4b4;
Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3interface Tff7b72= Te6edf3indexTb4b4b4;
T8b949e// Send packet to event queue, but free the
T8b949e// allocated memory again if the queue is
T8b949e// unable to receive the packet.
Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3len Tff7b72= Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3dataTb4b4b4, Te6edf3pbufTb4b4b4, Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3modem_packet_queue Tff7b72|Tff7b72| Te6edf3xQueueSendFromISRTb4b4b4(Te6edf3modem_packet_queueTb4b4b4, Tff7b72&Te6edf3modem_packetTb4b4b4, Tffa657NULLTb4b4b4) Tff7b72!Tff7b72= Te6edf3pdPASSTb4b4b4) Tb4b4b4{
Te6edf3freeTb4b4b4(Te6edf3modem_packetTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72void Te6edf3ISR_VECT Te6edf3receive_callbackTb4b4b4(Tff7b72uint8_t Te6edf3indexTb4b4b4, Tff7b72int Te6edf3packet_sizeTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4;
Tff7b72bool Td2a8ffready Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3BaseType_t Te6edf3int_maskTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3promiscTb4b4b4) Tb4b4b4{
T8b949e// The standard operating mode allows large
T8b949e// packets with a payload up to 500 bytes,
T8b949e// by combining two raw LoRa packets.
T8b949e// We read the 1-byte header and extract
T8b949e// packet sequence number and split flags
Tff7b72uint8_t Te6edf3header Tff7b72= Te6edf3selected_radioTff7b72-Tff7b72>Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3packet_sizeTff7b72-Tff7b72-Tb4b4b4;
Tff7b72uint8_t Te6edf3sequence Tff7b72= Te6edf3packetSequenceTb4b4b4(Te6edf3headerTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3isSplitPacketTb4b4b4(Te6edf3headerTb4b4b4) Tff7b72&Tff7b72& Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72=Tff7b72= Te6edf3SEQ_UNSETTb4b4b4) Tb4b4b4{
T8b949e// This is the first part of a split
T8b949e// packet, so we set the seq variable
T8b949e// and add the data to the buffer
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Te6edf3int_mask Tff7b72= Te6edf3taskENTER_CRITICAL_FROM_ISRTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4; Te6edf3taskEXIT_CRITICAL_FROM_ISRTb4b4b4(Te6edf3int_maskTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= Te6edf3sequenceTb4b4b4;
Te6edf3getPacketDataTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3packet_sizeTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3isSplitPacketTb4b4b4(Te6edf3headerTb4b4b4) Tff7b72&Tff7b72& Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72=Tff7b72= Te6edf3sequenceTb4b4b4) Tb4b4b4{
T8b949e// This is the second part of a split
T8b949e// packet, so we add it to the buffer
T8b949e// and set the ready flag.
Te6edf3getPacketDataTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3packet_sizeTb4b4b4)Tb4b4b4;
Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= Te6edf3SEQ_UNSETTb4b4b4;
Td2a8ffready Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3isSplitPacketTb4b4b4(Te6edf3headerTb4b4b4) Tff7b72&Tff7b72& Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72!Tff7b72= Te6edf3sequenceTb4b4b4) Tb4b4b4{
T8b949e// This split packet does not carry the
T8b949e// same sequence id, so we must assume
T8b949e// that we are seeing the first part of
T8b949e// a new split packet.
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Te6edf3int_mask Tff7b72= Te6edf3taskENTER_CRITICAL_FROM_ISRTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4; Te6edf3taskEXIT_CRITICAL_FROM_ISRTb4b4b4(Te6edf3int_maskTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= Te6edf3sequenceTb4b4b4;
Te6edf3getPacketDataTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3packet_sizeTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isSplitPacketTb4b4b4(Te6edf3headerTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// This is not a split packet, so we
T8b949e// just read it and set the ready
T8b949e// flag to true.
Tff7b72if Tb4b4b4(Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72!Tff7b72= Te6edf3SEQ_UNSETTb4b4b4) Tb4b4b4{
T8b949e// If we already had part of a split
T8b949e// packet in the buffer, we clear it.
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Te6edf3int_mask Tff7b72= Te6edf3taskENTER_CRITICAL_FROM_ISRTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4; Te6edf3taskEXIT_CRITICAL_FROM_ISRTb4b4b4(Te6edf3int_maskTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3seqTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= Te6edf3SEQ_UNSETTb4b4b4;
Tb4b4b4}
Te6edf3getPacketDataTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3packet_sizeTb4b4b4)Tb4b4b4;
Td2a8ffready Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// In promiscuous mode, raw packets are
T8b949e// output directly to the host
Te6edf3read_lenTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3getPacketDataTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3packet_sizeTb4b4b4)Tb4b4b4;
Td2a8ffready Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
T8b949e// Temporary fix for permanent preamble detected bug
T8b949e// TODO: figure out how to prevent the timing issue which causes the IRQ to never be cleared
Te6edf3interface_objTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72-Tff7b72>Te6edf3getPacketValidityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Td2a8ffreadyTb4b4b4) Tb4b4b4{
Te6edf3queue_packetTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3indexTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3last_rx Tff7b72= Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72bool Te6edf3startRadioTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Te6edf3update_radio_lockTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3modems_installed Tff7b72&Tff7b72& Tff7b72!Te6edf3console_activeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Te6edf3getRadioOnlineTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Te6edf3getRadioLockTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3hw_readyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Td2a8ffbeginTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// The radio could not be started.
T8b949e// Indicate this failure over both the
T8b949e// serial port and with the onboard LEDs
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_INITRADIOTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_errorTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3enableCrcTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Td2a8ffonReceiveTb4b4b4(Te6edf3receive_callbackTb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Te6edf3updateBitrateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sort_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_phy_statsTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Te6edf3lora_receiveTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
T8b949e// Flash an info pattern to indicate
T8b949e// that the radio is now on
Te6edf3kiss_indicate_radiostateTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_infoTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Flash a warning pattern to indicate
T8b949e// that the radio was locked, and thus
T8b949e// not started
Te6edf3kiss_indicate_radiostateTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_warningTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If radio is already on, we silently
T8b949e// ignore the request.
Te6edf3kiss_indicate_radiostateTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72void Te6edf3stopRadioTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getRadioOnlineTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Td2a8ffendTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sort_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_radiostateTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3update_radio_lockTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getFrequencyTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3radioTff7b72-Tff7b72>Te6edf3getSignalBandwidthTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3radioTff7b72-Tff7b72>Te6edf3getTxPowerTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0xFF Tff7b72&Tff7b72& Te6edf3radioTff7b72-Tff7b72>Te6edf3getSpreadingFactorTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3setRadioLockTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3setRadioLockTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Check if the queue is full for the selected radio.
T8b949e// Returns true if full, false if not
Tff7b72bool Te6edf3queue_fullTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3queue_heightTb4b4b4[Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72>Tff7b72= Tb4b4b4(Te6edf3CONFIG_QUEUE_MAX_LENGTHTb4b4b4) Tff7b72|Tff7b72| Te6edf3queued_bytesTb4b4b4[Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72>Tff7b72= Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72volatile Tff7b72bool Te6edf3queue_flushing Tff7b72= Tff7b72falseTb4b4b4;
T8b949e// Flushes all packets for the interface
Tff7b72void Te6edf3flush_queueTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72uint8_t Te6edf3index Tff7b72= Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3queue_flushingTb4b4b4) Tb4b4b4{
Te6edf3queue_flushing Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3led_tx_onTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72uint16_t Te6edf3processed Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72uint8_t Te6edf3data_byteTb4b4b4;
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3fifo16_isemptyTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3start Tff7b72= Te6edf3fifo16_popTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72uint16_t Te6edf3length Tff7b72= Te6edf3fifo16_popTb4b4b4(Tff7b72&Te6edf3packet_lengthsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72>Tff7b72= Te6edf3MIN_L Tff7b72&Tff7b72& Te6edf3length Tff7b72<Tff7b72= Te6edf3MTUTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72uint16_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3lengthTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3pos Tff7b72= Tb4b4b4(Te6edf3startTff7b72+Te6edf3iTb4b4b4)Tff7b72%Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3indexTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3tbufTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3packet_queueTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4[Te6edf3posTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3transmitTb4b4b4(Te6edf3radioTb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4;
Te6edf3processedTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3lora_receiveTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4;
Te6edf3led_tx_offTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3queue_flushing Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3queue_heightTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3queued_bytesTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Te6edf3updateAirtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Te6edf3display_txTb4b4b4[Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72void Te6edf3pop_queueTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72uint8_t Te6edf3index Tff7b72= Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3queue_flushingTb4b4b4) Tb4b4b4{
Te6edf3queue_flushing Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3led_tx_onTb4b4b4(Tb4b4b4)Tb4b4b4; Tff7b72uint16_t Te6edf3processed Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo16_isemptyTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3start Tff7b72= Te6edf3fifo16_popTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72uint16_t Te6edf3length Tff7b72= Te6edf3fifo16_popTb4b4b4(Tff7b72&Te6edf3packet_lengthsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72>Tff7b72= Te6edf3MIN_L Tff7b72&Tff7b72& Te6edf3length Tff7b72<Tff7b72= Te6edf3MTUTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72uint16_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3lengthTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3pos Tff7b72= Tb4b4b4(Te6edf3startTff7b72+Te6edf3iTb4b4b4)Tff7b72%Te6edf3getQueueSizeTb4b4b4(Te6edf3indexTb4b4b4)Tb4b4b4;
Te6edf3tbufTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3packet_queueTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4[Te6edf3posTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3transmitTb4b4b4(Te6edf3radioTb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4; Te6edf3processedTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3queue_heightTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72-Tff7b72= Te6edf3processedTb4b4b4;
Te6edf3queued_bytesTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72-Tff7b72= Te6edf3lengthTb4b4b4;
Tb4b4b4}
Te6edf3lora_receiveTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4; Te6edf3led_tx_offTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Te6edf3updateAirtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3queue_flushing Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Te6edf3display_txTb4b4b4[Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72void Te6edf3transmitTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4, Tff7b72uint16_t Td2a8ffsizeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getRadioOnlineTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3promiscTb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3written Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72uint8_t Te6edf3header Tff7b72= Td2a8ffrandomTb4b4b4(T79c0ff256Tb4b4b4) Tff7b72& T79c0ff0xF0Tb4b4b4;
Tff7b72if Tb4b4b4(Td2a8ffsize Tff7b72> Te6edf3SINGLE_MTU Tff7b72- Te6edf3HEADER_LTb4b4b4) Tb4b4b4{
Te6edf3header Tff7b72= Te6edf3header Tff7b72| Te6edf3FLAG_SPLITTb4b4b4;
Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Td2a8ffbeginPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Td2a8ffwriteTb4b4b4(Te6edf3headerTb4b4b4)Tb4b4b4; Te6edf3writtenTff7b72+Tff7b72+Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72uint16_t Te6edf3iTff7b72=T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Td2a8ffsizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Td2a8ffwriteTb4b4b4(Te6edf3tbufTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3writtenTff7b72+Tff7b72+Tb4b4b4;
T8b949e// Only start a new packet if this is a split packet and it has
T8b949e// exceeded the length of a single packet
Tff7b72if Tb4b4b4(Te6edf3written Tff7b72=Tff7b72= T79c0ff255 Tff7b72&Tff7b72& Te6edf3isSplitPacketTb4b4b4(Te6edf3headerTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Td2a8ffendPacketTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_MODEM_TIMEOUTTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_TXFAILEDTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_errorTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4;
Te6edf3hard_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Te6edf3addAirtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Td2a8ffbeginPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Td2a8ffwriteTb4b4b4(Te6edf3headerTb4b4b4)Tb4b4b4;
Te6edf3written Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Td2a8ffendPacketTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_MODEM_TIMEOUTTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_TXFAILEDTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_errorTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4;
Te6edf3hard_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Te6edf3addAirtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// In promiscuous mode, we only send out
T8b949e// plain raw LoRa packets with a maximum
T8b949e// payload of 255 bytes
Te6edf3led_tx_onTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72uint16_t Te6edf3written Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// Cap packets at 255 bytes
Tff7b72if Tb4b4b4(Td2a8ffsize Tff7b72> Te6edf3SINGLE_MTUTb4b4b4) Tb4b4b4{
Td2a8ffsize Tff7b72= Te6edf3SINGLE_MTUTb4b4b4;
Tb4b4b4}
T8b949e// If implicit header mode has been set,
T8b949e// set packet length to payload data length
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3implicitTb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Td2a8ffbeginPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Td2a8ffbeginPacketTb4b4b4(Td2a8ffsizeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72uint16_t Te6edf3iTff7b72=T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Td2a8ffsizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Td2a8ffwriteTb4b4b4(Te6edf3tbufTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3writtenTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Td2a8ffendPacketTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3radioTff7b72-Tff7b72>Te6edf3addAirtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3last_tx Tff7b72= Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_TXFAILEDTb4b4b4)Tb4b4b4;
Te6edf3led_indicate_errorTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3serial_callbackTb4b4b4(Tff7b72uint8_t Te6edf3sbyteTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3IN_FRAME Tff7b72&Tff7b72& Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FEND Tff7b72&Tff7b72&
Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DATATb4b4b4) Tb4b4b4{
Te6edf3IN_FRAME Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3interface Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo16_isfullTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3queued_bytesTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72< Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72uint16_t Te6edf3s Tff7b72= Te6edf3current_packet_startTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72int32_t Te6edf3e Tff7b72= Te6edf3queue_cursorTb4b4b4[Te6edf3interfaceTb4b4b4]T79c0ff-1Tb4b4b4; Tff7b72if Tb4b4b4(Te6edf3e Tff7b72=Tff7b72= T79c0ff-1Tb4b4b4) Te6edf3e Tff7b72= Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4)T79c0ff-1Tb4b4b4;
Tff7b72uint16_t Te6edf3lTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3s Tff7b72!Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3l Tff7b72= Tb4b4b4(Te6edf3s Tff7b72< Te6edf3eTb4b4b4) Tff7b72? Te6edf3e Tff7b72- Te6edf3s Tff7b72+ T79c0ff1Tff7b72: Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4) Tff7b72- Te6edf3s Tff7b72+ Te6edf3e Tff7b72+ T79c0ff1Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3l Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3l Tff7b72>Tff7b72= Te6edf3MIN_LTb4b4b4) Tb4b4b4{
Te6edf3queue_heightTb4b4b4[Te6edf3interfaceTb4b4b4]Tff7b72+Tff7b72+Tb4b4b4;
Te6edf3fifo16_pushTb4b4b4(Tff7b72&Te6edf3packet_startsTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4)Tb4b4b4;
Te6edf3fifo16_pushTb4b4b4(Tff7b72&Te6edf3packet_lengthsTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4, Te6edf3lTb4b4b4)Tb4b4b4;
Te6edf3current_packet_startTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72= Te6edf3queue_cursorTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FENDTb4b4b4) Tb4b4b4{
Te6edf3IN_FRAME Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3command Tff7b72= Te6edf3CMD_UNKNOWNTb4b4b4;
Te6edf3frame_len Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3IN_FRAME Tff7b72&Tff7b72& Te6edf3frame_len Tff7b72< Te6edf3MTUTb4b4b4) Tb4b4b4{
T8b949e// Have a look at the command byte first
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_UNKNOWNTb4b4b4) Tb4b4b4{
Te6edf3command Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_SEL_INTTb4b4b4) Tb4b4b4{
Te6edf3interface Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DATATb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Te6edf3cable_state Tff7b72= Te6edf3CABLE_STATE_CONNECTEDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3interface Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3queue_heightTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72< Te6edf3CONFIG_QUEUE_MAX_LENGTH Tff7b72&Tff7b72& Te6edf3queued_bytesTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72< Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3queued_bytesTb4b4b4[Te6edf3interfaceTb4b4b4]Tff7b72+Tff7b72+Tb4b4b4;
Te6edf3packet_queueTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4[Te6edf3queue_cursorTb4b4b4[Te6edf3interfaceTb4b4b4]Tff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3queue_cursorTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72=Tff7b72= Tb4b4b4(Te6edf3getQueueSizeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4)Tb4b4b4) Te6edf3queue_cursorTb4b4b4[Te6edf3interfaceTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_INTERFACESTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_interfaceTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FREQUENCYTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff4Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72uint32_t Te6edf3freq Tff7b72= Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff24 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<Tff7b72< T79c0ff16 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3freq Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_frequencyTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3op_mode Tff7b72=Tff7b72= Te6edf3MODE_HOSTTb4b4b4) Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setFrequencyTb4b4b4(Te6edf3freqTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_frequencyTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_BANDWIDTHTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff4Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72uint32_t Te6edf3bw Tff7b72= Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff24 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<Tff7b72< T79c0ff16 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8 Tff7b72| Tb4b4b4(Tff7b72uint32_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bw Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_bandwidthTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3op_mode Tff7b72=Tff7b72= Te6edf3MODE_HOSTTb4b4b4) Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setSignalBandwidthTb4b4b4(Te6edf3bwTb4b4b4)Tb4b4b4;
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3updateBitrateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sort_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_bandwidthTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_phy_statsTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_TXPOWERTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_txpowerTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72int8_t Te6edf3txp Tff7b72= Tb4b4b4(Tff7b72int8_tTb4b4b4)Te6edf3sbyteTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3op_mode Tff7b72=Tff7b72= Te6edf3MODE_HOSTTb4b4b4) Te6edf3setTXPowerTb4b4b4(Te6edf3selected_radioTb4b4b4, Te6edf3txpTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_txpowerTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_SFTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_spreadingfactorTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72int Te6edf3sf Tff7b72= Te6edf3sbyteTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72< T79c0ff5Tb4b4b4) Te6edf3sf Tff7b72= T79c0ff5Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sf Tff7b72> T79c0ff12Tb4b4b4) Te6edf3sf Tff7b72= T79c0ff12Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3op_mode Tff7b72=Tff7b72= Te6edf3MODE_HOSTTb4b4b4) Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setSpreadingFactorTb4b4b4(Te6edf3sfTb4b4b4)Tb4b4b4;
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3updateBitrateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sort_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_spreadingfactorTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_phy_statsTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_CRTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_codingrateTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72int Te6edf3cr Tff7b72= Te6edf3sbyteTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cr Tff7b72< T79c0ff5Tb4b4b4) Te6edf3cr Tff7b72= T79c0ff5Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cr Tff7b72> T79c0ff8Tb4b4b4) Te6edf3cr Tff7b72= T79c0ff8Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3op_mode Tff7b72=Tff7b72= Te6edf3MODE_HOSTTb4b4b4) Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setCodingRate4Tb4b4b4(Te6edf3crTb4b4b4)Tb4b4b4;
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3updateBitrateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sort_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_codingrateTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_phy_statsTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_IMPLICITTb4b4b4) Tb4b4b4{
Te6edf3set_implicit_lengthTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_implicit_lengthTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_LEAVETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3cable_state Tff7b72= Te6edf3CABLE_STATE_DISCONNECTEDTb4b4b4;
T8b949e//current_rssi = -292;
Te6edf3last_rssi Tff7b72= T79c0ff-292Tb4b4b4;
Te6edf3last_rssi_raw Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3last_snr_raw Tff7b72= T79c0ff0x80Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_RADIO_STATETb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Te6edf3cable_state Tff7b72= Te6edf3CABLE_STATE_CONNECTEDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_radiostateTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3stopRadioTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3startRadioTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_ST_ALOCKTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72uint16_t Te6edf3at Tff7b72= Tb4b4b4(Tff7b72uint16_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8 Tff7b72| Tb4b4b4(Tff7b72uint16_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3at Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setSTALockTb4b4b4(T79c0ff0.0Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72int Te6edf3st_airtime_limit Tff7b72= Tb4b4b4(Tff7b72floatTb4b4b4)Te6edf3atTff7b72/Tb4b4b4(T79c0ff100.0Tff7b72*T79c0ff100.0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3st_airtime_limit Tff7b72>Tff7b72= T79c0ff1.0Tb4b4b4) Tb4b4b4{ Te6edf3st_airtime_limit Tff7b72= T79c0ff0.0Tb4b4b4; Tb4b4b4}
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setSTALockTb4b4b4(Te6edf3st_airtime_limitTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3kiss_indicate_st_alockTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_LT_ALOCKTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72uint16_t Te6edf3at Tff7b72= Tb4b4b4(Tff7b72uint16_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8 Tff7b72| Tb4b4b4(Tff7b72uint16_tTb4b4b4)Te6edf3cmdbufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3at Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setLTALockTb4b4b4(T79c0ff0.0Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72int Te6edf3lt_airtime_limit Tff7b72= Tb4b4b4(Tff7b72floatTb4b4b4)Te6edf3atTff7b72/Tb4b4b4(T79c0ff100.0Tff7b72*T79c0ff100.0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lt_airtime_limit Tff7b72>Tff7b72= T79c0ff1.0Tb4b4b4) Tb4b4b4{ Te6edf3lt_airtime_limit Tff7b72= T79c0ff0.0Tb4b4b4; Tb4b4b4}
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3setLTALockTb4b4b4(Te6edf3lt_airtime_limitTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3kiss_indicate_lt_alockTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_STAT_RXTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_stat_rxTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_STAT_TXTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_stat_txTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_STAT_RSSITb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_stat_rssiTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_RADIO_LOCKTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Te6edf3update_radio_lockTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_radio_lockTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_BLINKTb4b4b4) Tb4b4b4{
Te6edf3led_indicate_infoTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_RANDOMTb4b4b4) Tb4b4b4{
T8b949e// pick an interface at random to get data from
Tff7b72int Te6edf3int_index Tff7b72= Td2a8ffrandomTb4b4b4(Te6edf3INTERFACE_COUNTTb4b4b4)Tb4b4b4;
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3int_indexTb4b4b4]Tb4b4b4;
Te6edf3kiss_indicate_randomTb4b4b4(Te6edf3getRandomTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3interface Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DETECTTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3DETECT_REQTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Te6edf3cable_state Tff7b72= Te6edf3CABLE_STATE_CONNECTEDTb4b4b4;
Te6edf3kiss_indicate_detectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_PROMISCTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3promisc_enableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3promisc_disableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3kiss_indicate_promiscTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_READYTb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3interfaceTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3queue_fullTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_readyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3kiss_indicate_not_readyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_UNLOCK_ROMTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3ROM_UNLOCK_BYTETb4b4b4) Tb4b4b4{
Te6edf3unlock_romTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_RESETTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3CMD_RESET_BYTETb4b4b4) Tb4b4b4{
Te6edf3hard_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_ROM_READTb4b4b4) Tb4b4b4{
Te6edf3kiss_dump_eepromTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_ROM_WRITETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{
Te6edf3eeprom_writeTb4b4b4(Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3cmdbufTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FW_VERSIONTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_versionTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_PLATFORMTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_platformTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_MCUTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_mcuTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_BOARDTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_boardTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_CONF_SAVETb4b4b4) Tb4b4b4{
T8b949e// todo: add extra space in EEPROM so this isn't hardcoded
Te6edf3eeprom_conf_saveTb4b4b4(Te6edf3interface_objTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_CONF_DELETETb4b4b4) Tb4b4b4{
Te6edf3eeprom_conf_deleteTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FB_EXTTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY == true
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_fbstateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3ext_fb_disableTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_fbstateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3ext_fb_enableTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_fbstateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FB_WRITETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= T79c0ff9Tb4b4b4) Tb4b4b4{
Tff7b72uint8_t Td2a8ffline Tff7b72= Te6edf3cmdbufTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Td2a8ffline Tff7b72> T79c0ff63Tb4b4b4) Td2a8ffline Tff7b72= T79c0ff63Tb4b4b4;
Tff7b72int Te6edf3fb_o Tff7b72= Td2a8fflineTff7b72*T79c0ff8Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3fbTff7b72+Te6edf3fb_oTb4b4b4, Te6edf3cmdbufTff7b72+T79c0ff1Tb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FB_READTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72!Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_fbTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_READTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72!Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{ Te6edf3kiss_indicate_dispTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DEV_HASHTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72!Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_device_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DEV_SIGTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= Te6edf3DEV_SIG_LENTb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Te6edf3dev_sigTb4b4b4, Te6edf3cmdbufTb4b4b4, Te6edf3DEV_SIG_LENTb4b4b4)Tb4b4b4;
Te6edf3device_save_signatureTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FW_UPDTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3firmware_update_mode Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3firmware_update_mode Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_HASHESTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_target_fw_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x02Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_fw_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x03Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_bootloader_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x04Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_partition_table_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_FW_HASHTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72< Te6edf3CMD_LTb4b4b4) Te6edf3cmdbufTb4b4b4[Te6edf3frame_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3sbyteTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3frame_len Tff7b72=Tff7b72= Te6edf3DEV_HASH_LENTb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Te6edf3dev_firmware_hash_targetTb4b4b4, Te6edf3cmdbufTb4b4b4, Te6edf3DEV_HASH_LENTb4b4b4)Tb4b4b4;
Te6edf3device_save_firmware_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_BT_CTRLTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x00Tb4b4b4) Tb4b4b4{
Te6edf3bt_stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_conf_saveTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{
Te6edf3bt_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_conf_saveTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x02Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72=Tff7b72= Te6edf3BT_STATE_OFFTb4b4b4) Tb4b4b4{
Te6edf3bt_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_conf_saveTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Tb4b4b4{
Te6edf3bt_enable_pairingTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_BT_UNPAIRTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_BLE
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= T79c0ff0x01Tb4b4b4) Tb4b4b4{ Te6edf3bt_debond_allTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_INTTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3display_intensity Tff7b72= Te6edf3sbyteTb4b4b4;
Te6edf3di_conf_saveTb4b4b4(Te6edf3display_intensityTb4b4b4)Tb4b4b4;
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_ADDRTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3display_addr Tff7b72= Te6edf3sbyteTb4b4b4;
Te6edf3da_conf_saveTb4b4b4(Te6edf3display_addrTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_BLNKTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3db_conf_saveTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_ROTTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3drot_conf_saveTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DIS_IATb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3dia_conf_saveTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_DISP_RCNDTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72> T79c0ff0x00Tb4b4b4) Te6edf3recondition_display Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3command Tff7b72=Tff7b72= Te6edf3CMD_NP_INTTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_NP
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3FESCTb4b4b4) Tb4b4b4{
Te6edf3ESCAPE Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ESCAPETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFENDTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FENDTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sbyte Tff7b72=Tff7b72= Te6edf3TFESCTb4b4b4) Te6edf3sbyte Tff7b72= Te6edf3FESCTb4b4b4;
Te6edf3ESCAPE Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3sbyteTb4b4b4;
Te6edf3led_set_intensityTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Te6edf3np_int_conf_saveTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Te6edf3portMUX_TYPE Te6edf3update_lock Tff7b72= Te6edf3portMUX_INITIALIZER_UNLOCKEDTb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72bool Te6edf3medium_freeTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3updateModemStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getAvdInterferenceTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3radioTff7b72-Tff7b72>Te6edf3getInterferenceTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72return Tff7b72falseTb4b4b4; Tb4b4b4}
Tff7b72return Tff7b72!Te6edf3radioTff7b72-Tff7b72>Te6edf3getDCDTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72void Te6edf3validate_statusTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
T8b949e// TODO: Get ESP32 boot flags
Tff7b72uint8_t Te6edf3boot_flags Tff7b72= T79c0ff0x02Tb4b4b4;
Tff7b72uint8_t Te6edf3F_POR Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72uint8_t Te6edf3F_BOR Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72uint8_t Te6edf3F_WDR Tff7b72= T79c0ff0x01Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
T8b949e// TODO: Get NRF52 boot flags
Tff7b72uint8_t Te6edf3boot_flags Tff7b72= T79c0ff0x02Tb4b4b4;
Tff7b72uint8_t Te6edf3F_POR Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72uint8_t Te6edf3F_BOR Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72uint8_t Te6edf3F_WDR Tff7b72= T79c0ff0x01Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3hw_ready Tff7b72|Tff7b72| Te6edf3device_init_doneTb4b4b4) Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffError, invalid hardware check stateTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3led_indicate_boot_errorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3boot_flags Tff7b72& Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<Te6edf3F_PORTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3boot_vector Tff7b72= Te6edf3START_FROM_POWERONTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3boot_flags Tff7b72& Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<Te6edf3F_BORTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3boot_vector Tff7b72= Te6edf3START_FROM_BROWNOUTTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3boot_flags Tff7b72& Tb4b4b4(T79c0ff1Tff7b72<Tff7b72<Te6edf3F_WDRTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3boot_vector Tff7b72= Te6edf3START_FROM_BOOTLOADERTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffError, indeterminate boot vectorTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3led_indicate_boot_errorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3boot_vector Tff7b72=Tff7b72= Te6edf3START_FROM_BOOTLOADER Tff7b72|Tff7b72| Te6edf3boot_vector Tff7b72=Tff7b72= Te6edf3START_FROM_POWERONTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3eeprom_lock_setTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3eeprom_product_validTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3eeprom_model_validTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3eeprom_hwrev_validTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3eeprom_checksum_validTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3eeprom_ok Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3modems_installedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3device_initTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffNo radio module foundTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffInvalid EEPROM checksumTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffInvalid EEPROM configurationTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffDevice unprovisioned, no device configuration found in EEPROMTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3hw_ready Tff7b72= Tff7b72falseTb4b4b4;
Td2a8ffSerialTb4b4b4.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffError, incorrect boot vectorTffea00\rTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Te6edf3device_init_done Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3led_indicate_boot_errorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3tx_queue_handlerTb4b4b4(Te6edf3RadioInterfaceTff7b72* Te6edf3radioTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3queue_heightTb4b4b4[Te6edf3radioTff7b72-Tff7b72>Te6edf3getIndexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWTb4b4b4(Td2a8ffrandomTb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWMinTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWMaxTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWWaitTargetTb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3radioTff7b72-Tff7b72>Te6edf3getCSMASlotMSTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getDifsWaitStartTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{ T8b949e// DIFS wait not yet started
Tff7b72if Tb4b4b4(Te6edf3medium_freeTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioTff7b72-Tff7b72>Te6edf3setDifsWaitStartTb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4; Tff7b72returnTb4b4b4; Tb4b4b4} T8b949e// Set DIFS wait start time
Tff7b72else Tb4b4b4{ Tff7b72returnTb4b4b4; Tb4b4b4} Tb4b4b4} T8b949e// Medium not yet free, continue waiting
Tff7b72else Tb4b4b4{ T8b949e// We are waiting for DIFS or CW to pass
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3medium_freeTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioTff7b72-Tff7b72>Te6edf3setDifsWaitStartTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4; Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWWaitStartTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4; Tff7b72returnTb4b4b4; Tb4b4b4} T8b949e// Medium became occupied while in DIFS wait, restart waiting when free again
Tff7b72else Tb4b4b4{ T8b949e// Medium is free, so continue waiting
Tff7b72if Tb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3radioTff7b72-Tff7b72>Te6edf3getDifsWaitStartTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3radioTff7b72-Tff7b72>Te6edf3getDifsMSTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72returnTb4b4b4; Tb4b4b4} T8b949e// DIFS has not yet passed, continue waiting
Tff7b72else Tb4b4b4{ T8b949e// DIFS has passed, and we are now in CW wait
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWWaitStartTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWWaitStartTb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4; Tff7b72returnTb4b4b4; Tb4b4b4} T8b949e// If we haven't started counting CW wait time, do it from now
Tff7b72else Tb4b4b4{ T8b949e// If we are already counting CW wait time, add it to the counter
Te6edf3radioTff7b72-Tff7b72>Te6edf3addCWWaitPassedTb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWWaitStartTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWWaitStartTb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3radioTff7b72-Tff7b72>Te6edf3getCWWaitStatusTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Tff7b72returnTb4b4b4; Tb4b4b4} T8b949e// Contention window wait time has not yet passed, continue waiting
Tff7b72else Tb4b4b4{ T8b949e// Wait time has passed, flush the queue
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radioTff7b72-Tff7b72>Te6edf3getLimitRateTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3flush_queueTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4; Tb4b4b4} Tff7b72else Tb4b4b4{ Te6edf3pop_queueTb4b4b4(Te6edf3radioTb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3radioTff7b72-Tff7b72>Te6edf3resetCWWaitPassedTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3radioTff7b72-Tff7b72>Te6edf3setCWTb4b4b4(T79c0ff-1Tb4b4b4)Tb4b4b4; Te6edf3radioTff7b72-Tff7b72>Te6edf3setDifsWaitStartTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3work_while_waitingTb4b4b4(Tb4b4b4) Tb4b4b4{ Tffa657loopTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72void Tffa657loopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Te6edf3modem_packet_t Tff7b72*Te6edf3modem_packet Tff7b72= Tffa657NULLTb4b4b4;
Tff7b72ifTb4b4b4(Te6edf3modem_packet_queue Tff7b72&Tff7b72& Te6edf3xQueueReceiveTb4b4b4(Te6edf3modem_packet_queueTb4b4b4, Tff7b72&Te6edf3modem_packetTb4b4b4, T79c0ff0Tb4b4b4) Tff7b72=Tff7b72= Te6edf3pdTRUE Tff7b72&Tff7b72& Te6edf3modem_packetTb4b4b4) Tb4b4b4{
Tff7b72uint8_t Te6edf3packet_interface Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3interfaceTb4b4b4;
Te6edf3read_lenTb4b4b4[Te6edf3packet_interfaceTb4b4b4] Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3lenTb4b4b4;
Te6edf3last_rssi Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3rssiTb4b4b4;
Te6edf3last_snr_raw Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3snr_rawTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pbufTb4b4b4, Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3dataTb4b4b4, Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3freeTb4b4b4(Te6edf3modem_packetTb4b4b4)Tb4b4b4;
Te6edf3modem_packet Tff7b72= Tffa657NULLTb4b4b4;
Te6edf3kiss_indicate_stat_rssiTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3packet_interfaceTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_stat_snrTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3packet_interfaceTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3kiss_write_packetTb4b4b4(Te6edf3packet_interfaceTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Te6edf3modem_packet_t Tff7b72*Te6edf3modem_packet Tff7b72= Tffa657NULLTb4b4b4;
Tff7b72ifTb4b4b4(Te6edf3modem_packet_queue Tff7b72&Tff7b72& Te6edf3xQueueReceiveTb4b4b4(Te6edf3modem_packet_queueTb4b4b4, Tff7b72&Te6edf3modem_packetTb4b4b4, T79c0ff0Tb4b4b4) Tff7b72=Tff7b72= Te6edf3pdTRUE Tff7b72&Tff7b72& Te6edf3modem_packetTb4b4b4) Tb4b4b4{
Tff7b72uint8_t Te6edf3packet_interface Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3interfaceTb4b4b4;
Te6edf3read_lenTb4b4b4[Te6edf3packet_interfaceTb4b4b4] Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3lenTb4b4b4;
Te6edf3last_rssi Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3rssiTb4b4b4;
Te6edf3last_snr_raw Tff7b72= Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3snr_rawTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pbufTb4b4b4, Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3dataTb4b4b4, Te6edf3modem_packetTff7b72-Tff7b72>Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3freeTb4b4b4(Te6edf3modem_packetTb4b4b4)Tb4b4b4;
Te6edf3modem_packet Tff7b72= Tffa657NULLTb4b4b4;
Te6edf3kiss_indicate_stat_rssiTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3packet_interfaceTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3kiss_indicate_stat_snrTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3packet_interfaceTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3kiss_write_packetTb4b4b4(Te6edf3packet_interfaceTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72bool Td2a8ffready Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3getRadioOnlineTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Td2a8ffready Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// If at least one radio is online then we can continue
Tff7b72if Tb4b4b4(Td2a8ffreadyTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3selected_radio Tff7b72= Te6edf3interface_obj_sortedTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3calculateALockTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tff7b72!Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3getRadioOnlineTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// skip this interface
Tff7b72continueTb4b4b4;
Tb4b4b4}
Te6edf3tx_queue_handlerTb4b4b4(Te6edf3selected_radioTb4b4b4)Tb4b4b4;
Te6edf3selected_radioTff7b72-Tff7b72>Te6edf3checkModemStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hw_readyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3console_activeTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_CONSOLE
Te6edf3console_loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3led_indicate_standbyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3led_indicate_not_readyTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// shut down all radio interfaces
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3stopRadioTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3process_serialTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_DISPLAY
Tff7b72#Tff7b72if DISPLAY == OLED || DISPLAY == TFT || DISPLAY == ADAFRUIT_TFT
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif DISPLAY == EINK_BW || DISPLAY == EINK_3C
T8b949e// Display refreshes take so long on e-paper displays that they can disrupt
T8b949e// the regular operation of the device. To combat this the time it is
T8b949e// chosen to do so must be strategically chosen. Particularly on the
T8b949e// RAK4631, the display and the potentially installed SX1280 modem share
T8b949e// the same SPI bus. Thus it is not possible to solve this by utilising the
T8b949e// callback functionality to poll the modem in this case. todo, this may be
T8b949e// able to be improved in the future.
Tff7b72if Tb4b4b4(Te6edf3disp_readyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3last_tx Tff7b72>Tff7b72= T79c0ff4000Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3last_rx Tff7b72>Tff7b72= T79c0ff1000Tb4b4b4) Tb4b4b4{
Te6edf3update_displayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_PMU
Tff7b72if Tb4b4b4(Te6edf3pmu_readyTb4b4b4) Te6edf3update_pmuTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE == true
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3console_active Tff7b72&Tff7b72& Te6edf3bt_readyTb4b4b4) Te6edf3update_btTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_INPUT
Te6edf3input_readTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_GPS
Tff7b72while Tb4b4b4(Te6edf3gps_sTb4b4b4.Td2a8ffavailableTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3gpsTb4b4b4.Te6edf3encodeTb4b4b4(Te6edf3gps_sTb4b4b4.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Td2a8ffmillisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3last_gps Tff7b72>Tff7b72= Te6edf3GPS_INTERVALTb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_locationTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3last_gps Tff7b72= Td2a8ffmillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Td2a8ffmillisTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff5000 Tff7b72&Tff7b72& Te6edf3gpsTb4b4b4.Te6edf3charsProcessedTb4b4b4(Tb4b4b4) Tff7b72< T79c0ff10Tb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Tff7b72trueTb4b4b4) Tb4b4b4{
Td2a8ffSerialTb4b4b4.Td2a8ffprintlnTb4b4b4(Te6edf3FTb4b4b4(Ta5d6ff"Ta5d6ffNo GPS detected: check wiring.Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3memory_lowTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if PLATFORM == PLATFORM_ESP32
Tff7b72if Tb4b4b4(Te6edf3esp_get_free_heap_sizeTb4b4b4(Tb4b4b4) Tff7b72< T79c0ff8192Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_MEMORY_LOWTb4b4b4)Tb4b4b4; Te6edf3memory_low Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3memory_low Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
Te6edf3kiss_indicate_errorTb4b4b4(Te6edf3ERROR_MEMORY_LOWTb4b4b4)Tb4b4b4; Te6edf3memory_low Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3process_serialTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3buffer_serialTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo_isemptyTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4) Te6edf3serial_pollTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72void Te6edf3sleep_nowTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_SLEEP == true
Tff7b72for Tb4b4b4(Tff7b72int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3INTERFACE_COUNTTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3stopRadioTb4b4b4(Te6edf3interface_objTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4; T8b949e// TODO: Check this on all platforms
Tb4b4b4}
Tff7b72#Tff7b72if PLATFORM == PLATFORM_ESP32
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_XIAO_S3
Te6edf3display_intensity Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3update_displayTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if PIN_DISP_SLEEP >= 0
Td2a8ffpinModeTb4b4b4(Te6edf3PIN_DISP_SLEEPTb4b4b4, Tff7b72OUTPUTTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_DISP_SLEEPTb4b4b4, Te6edf3DISP_SLEEP_LEVELTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if HAS_BLUETOOTH
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72=Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Tb4b4b4{
Te6edf3bt_stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3esp_sleep_enable_ext0_wakeupTb4b4b4(Te6edf3PIN_WAKEUPTb4b4b4, Te6edf3WAKEUP_LEVELTb4b4b4)Tb4b4b4;
Te6edf3esp_deep_sleep_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif PLATFORM == PLATFORM_NRF52
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_HELTEC_T114
Te6edf3npsetTb4b4b4(T79c0ff0Tb4b4b4,T79c0ff0Tb4b4b4,T79c0ff0Tb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72LOWTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_T114_TFT_BLGTTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Td2a8ffdigitalWriteTb4b4b4(Te6edf3PIN_T114_TFT_ENTb4b4b4, Tff7b72HIGHTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TECHO
Tff7b72for Tb4b4b4(Tff7b72uint8_t Te6edf3i Tff7b72= Te6edf3display_intensityTb4b4b4; Te6edf3i Tff7b72> T79c0ff0Tb4b4b4; Te6edf3iTff7b72-Tff7b72-Tb4b4b4) Tb4b4b4{ Td2a8ffanalogWriteTb4b4b4(Te6edf3pin_backlightTb4b4b4, Te6edf3iT79c0ff-1Tb4b4b4)Tb4b4b4; Td2a8ffdelayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3epd_blackTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4; Td2a8ffdelayTb4b4b4(T79c0ff300Tb4b4b4)Tb4b4b4; Te6edf3epd_blackTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4; Td2a8ffdelayTb4b4b4(T79c0ff300Tb4b4b4)Tb4b4b4; Te6edf3epd_blackTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff2000Tb4b4b4)Tb4b4b4;
Td2a8ffanalogWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Td2a8ffdelayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3sd_power_gpregret_setTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0x6dTb4b4b4)Tb4b4b4;
Te6edf3nrf_gpio_cfg_sense_inputTb4b4b4(Te6edf3pin_btn_usr1Tb4b4b4, Te6edf3NRF_GPIO_PIN_PULLUPTb4b4b4, Te6edf3NRF_GPIO_PIN_SENSE_LOWTb4b4b4)Tb4b4b4;
Te6edf3NRF_POWERTff7b72-Tff7b72>Te6edf3SYSTEMOFF Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72void Te6edf3button_eventTb4b4b4(Tff7b72uint8_t Te6edf3eventTb4b4b4, Tff7b72unsigned Tff7b72long Te6edf3durationTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3display_blankedTb4b4b4) Tb4b4b4{
Te6edf3display_unblankTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3duration Tff7b72> T79c0ff10000Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_CONSOLE
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE
Te6edf3bt_stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3console_active Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3console_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3duration Tff7b72> T79c0ff5000Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Tb4b4b4{ Te6edf3bt_enable_pairingTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3duration Tff7b72> T79c0ff700Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_SLEEP
Te6edf3sleep_nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72=Tff7b72= Te6edf3BT_STATE_OFFTb4b4b4) Tb4b4b4{
Te6edf3bt_startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_conf_saveTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3bt_stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bt_conf_saveTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72void Te6edf3poll_buffersTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3process_serialTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72volatile Tff7b72bool Te6edf3serial_polling Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72void Te6edf3serial_pollTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3serial_polling Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3fifo_isemptyTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72char Te6edf3sbyte Tff7b72= Te6edf3fifo_popTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4;
Te6edf3serial_callbackTb4b4b4(Te6edf3sbyteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3serial_polling Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72define MAX_CYCLES 20
Tff7b72void Te6edf3buffer_serialTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3serial_bufferingTb4b4b4) Tb4b4b4{
Te6edf3serial_buffering Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72uint8_t Te6edf3c Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE == true
Tff7b72while Tb4b4b4(
Te6edf3c Tff7b72< Te6edf3MAX_CYCLES Tff7b72&Tff7b72&
Tb4b4b4( Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_CONNECTED Tff7b72&Tff7b72& Td2a8ffSerialTb4b4b4.Td2a8ffavailableTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72|Tff7b72| Tb4b4b4(Te6edf3bt_state Tff7b72=Tff7b72= Te6edf3BT_STATE_CONNECTED Tff7b72&Tff7b72& Te6edf3SerialBTTb4b4b4.Td2a8ffavailableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4)
Tb4b4b4)
Tff7b72#Tff7b72else
Tff7b72while Tb4b4b4(Te6edf3c Tff7b72< Te6edf3MAX_CYCLES Tff7b72&Tff7b72& Td2a8ffSerialTb4b4b4.Td2a8ffavailableTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72#Tff7b72endif
Tb4b4b4{
Te6edf3cTff7b72+Tff7b72+Tb4b4b4;
Tff7b72#Tff7b72if HAS_BLUETOOTH || HAS_BLE == true
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72=Tff7b72= Te6edf3BT_STATE_CONNECTEDTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo_isfullTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fifo_pushTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4, Te6edf3SerialBTTb4b4b4.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo_isfullTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fifo_pushTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4, Td2a8ffSerialTb4b4b4.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72else
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fifo_isfullTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fifo_pushTb4b4b4(Tff7b72&Te6edf3serialFIFOTb4b4b4, Td2a8ffSerialTb4b4b4.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Te6edf3serial_buffering Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────